﻿//
// ParallelGrep
//
// Copyright (C) 2011 - Tatsuya Niioka
//
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;
using System.ComponentModel;
using System.Diagnostics;

namespace ParallelGrep
{
    /// <summary>
    /// ローカライズ文字列クラス
    /// </summary>
    public class LocalizedStrings : INotifyPropertyChanged
    {
        #region Constructor
        /// <summary>
        /// 新しいクラスを生成します。
        /// </summary>
        public LocalizedStrings()
        {
        }
        #endregion

        #region Resources
        private static ParallelGrep.Properties.Resources m_resources = new ParallelGrep.Properties.Resources();
        /// <summary>
        /// リソースを取得します。
        /// </summary>
        public ParallelGrep.Properties.Resources Resources
        {
            get
            {
                return m_resources;
            }
        }
        #endregion

        #region Culture
        /// <summary>
        /// カルチャを取得または設定します。
        /// </summary>
        public CultureInfo Culture
        {
            get
            {
                return ParallelGrep.Properties.Resources.Culture;
            }
            set
            {
                ParallelGrep.Properties.Resources.Culture = value;
                OnPropertyChanged("Culture");
                OnPropertyChanged("Resources");
            }
        }
        #endregion

        #region VerifyPropertyName
        /// <summary>
        /// プロパティをチェック時に例外をスローするかどうかの値
        /// </summary>
        protected virtual bool ThrowOnInvalidPropertyName { get; private set; }
        /// <summary>
        /// プロパティをチェックします。
        /// </summary>
        /// <param name="propertyName">プロパティ名</param>
        [Conditional("DEBUG")]
        [DebuggerStepThrough]
        public void VerifyPropertyName(string propertyName)
        {
            // Verify that the property selectCulture matches a real,  
            // public, instance property on this object.
            if (TypeDescriptor.GetProperties(this)[propertyName] == null)
            {
                string msg = "Invalid property name: " + propertyName;

                if (this.ThrowOnInvalidPropertyName)
                {
                    throw new Exception(msg);
                }
                else
                {
                    Debug.Fail(msg);
                }
            }
        }
        #endregion

        #region INotifyPropertyChanged
        /// <summary>
        /// プロパティ変更イベント
        /// </summary>
        public event PropertyChangedEventHandler PropertyChanged;
        /// <summary>
        /// 指定したプロパティ名でプロパティ変更イベントを実行します。
        /// </summary>
        /// <param name="propertyName">プロパティ名</param>
        protected virtual void OnPropertyChanged(string propertyName)
        {
            this.VerifyPropertyName(propertyName);

            PropertyChangedEventHandler handler = this.PropertyChanged;
            if (handler != null)
            {
                var e = new PropertyChangedEventArgs(propertyName);
                handler(this, e);
            }
        }
        #endregion
    }
}
